import {
  MiddlewareConsumer,
  Module,
  NestModule,
  RequestMethod,
} from '@nestjs/common';
import { APP_INTERCEPTOR, APP_PIPE } from '@nestjs/core';
import { ResponseInterceptor } from './interceptor/responseInterceptor';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AdminModule } from './api/admin/admin.module';
import { FileModule } from './api/file/file.module';
import { config } from '@/config/index';
import { SysModule } from './api/sys/sys.module';
import { IbaseService } from './lib/service/impl/IbaseServiceImpl';
import { ValidatePipe } from './pipe/validatePipe';
import { authMiddleware } from './middleware/authMiddleware';

let { typeOrm } = config;
@Module({
  // 引入外部的@Module相当于这个，
  // 在api/admin下有一个adminModule 也是和这里方式一样，有controller:[]这些，然后在imports里引
  imports: [
    TypeOrmModule.forRootAsync({
      useFactory: () => ({
        ...typeOrm,
      }),
    }),
    // auth : 有一个问题了。好像是在哪里做认证，哪里就要导入entity，比如这里就要遭APP。module里，和我的规范好像不同了
    /*   PassportModule.register({ defaultStrategy: 'jwt' }),
    JwtModule.register({
      secret: config.jwt.secret,
      signOptions: { expiresIn: config.jwt.expire },
    }), */
    // auth
    AdminModule,
    FileModule,
    SysModule,
  ],
  controllers: [],
  providers: [
    // auth
    /*  AuthService,
    JwtStrategy, */
    // auth
    IbaseService,
    {
      provide: APP_INTERCEPTOR,
      useClass: ResponseInterceptor,
    },
    {
      provide: APP_PIPE,
      // 全局验证管道：注意，这里的ValidatePipe 是自定义的，非nest自带的
      useClass: ValidatePipe,
    },
  ],
})
export class AppModule {
  /*   configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(authMiddleware)
      .forRoutes({ path: '*', method: RequestMethod.ALL });
  } */
}
